#ifndef PLUGINMANAGER_H
#define PLUGINMANAGER_H

#include <QObject>
#include <QDir>
#include <QPluginLoader>
#include <QHash>
#include <QPair>
#include "iplugin.h"
#include <qdebug.h>

class PluginManager : public QObject {
    Q_OBJECT

public:
    /**
     * 获取单例实例
     */
    static PluginManager& instance() {
        static PluginManager mgr;
        return mgr;
    }

    /**
     * 加载指定目录下的所有插件
     */
    void loadAll(const QString& pluginDir) {
        QDir dir(pluginDir);
        qDebug()<<"pluginDir: "<<QDir::current().absoluteFilePath(pluginDir);
        // 设置只过滤 .txt 和 .log 文件
        dir.setNameFilters({"*.so", "*.dll","*.dylib"});

        // 可选：设置只列出文件（不包括目录）
        dir.setFilter(QDir::Files);
        for (const auto& file : dir.entryList(QDir::Files)) {
            loadPlugin(dir.filePath(file));
        }
    }



    /**
     * 动态加载单个插件
     * @param path 插件文件路径
     * @return 是否加载成功
     */
    bool loadPlugin(const QString& path) {
        QPluginLoader loader(path);

        if (auto* plugin = qobject_cast<IPlugin*>(loader.instance())) {
//            plugin->initialize();
            m_plugins[plugin->name()] = plugin;
            emit sigAddPlugin(plugin->name());
            return true;
        } else {
            // 可选：输出加载失败原因
            qWarning() << "Failed to load plugin:" << path << "-" << loader.errorString();
            return false;
        }
    }

    /**
     * 卸载指定名称的插件
     * @param name 插件名称
     */
    void unloadPlugin(const QString& name) {
        if (m_plugins.contains(name)) {
            auto& plugin = m_plugins[name];
            emit sigDelPlugin(name);
            plugin->shutdown();
            m_plugins.remove(name);
        }
    }

    /**
     * 获取插件
     * @param name 插件名称
     */
    IPlugin* getPlugin(const QString& name)
    {
        return m_plugins.value(name,nullptr);
    }
signals:
    void sigAddPlugin(QString);
    void sigDelPlugin(QString);

private:
    // 私有构造函数（单例模式）
    explicit PluginManager(QObject* parent = nullptr) : QObject(parent) {}

    // 存储插件：名称 → (Loader, 实例指针)
    QHash<QString, IPlugin*> m_plugins;
};

#endif // PLUGINMANAGER_H


